﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

/*
 * Representa a lista de programa etc, como produzido pelo montador durante a operação Montar()
 * 
 */

namespace Montador
{
    public enum Secao
    {
        // identificadores e sequência de seções da lista de montagem
        Prot,       // Protocolo da montagem
        Fonte,      // código fonte, sem ou com observações
        Obs,        // observações = erros, alertas e debug
        Simbo,      // Símbolos, com ou sem referência crusada
        Objeto      // Objeto relocavel, com ou sem linhas fonte
    }
    public struct optLista
    {
        // passar um conjunto de opções para geração da lista: quais itens a mostrar
        public bool Protocolo;
        public bool Fonte;
        public bool ComObs;  // incluir observações entre linhas fonte
        public bool Observacoes;   // = erros, alertas, debug
        public bool Simbolos;
        public bool ComXref;   // incluir linhas de utilização do símbolo
        public bool Objeto;    // objeto relocavel. objeto executavel é responsabilidade de vinculador
        public bool ComFonte;  // misturar linhas fonte entre bytes do objeto
    }
    public class tblLista : DataTable
    {
        // contém a informação para produzir linhas impressa da lista de resultados da montagem.
        // Rows não estão em ordem, vai gerar um texto ordenado 1. por seção, 2. por posição
        // Uso das três colunas do texto é a discreção do programador. Formatos típcos:
        // col1 = num. da linha ou vazia, col2 qualquer texto
        // col1 = núm. da linha ou vazia, col2 um identificador, col3 qualquer texto

        public tblLista()
            : base()
        {
            this.Columns.Add(new DataColumn("Secao", typeof(int)));
            this.Columns.Add(new DataColumn("Posicao", typeof(int)));
            this.Columns.Add(new DataColumn("Col1", typeof(string)));
            this.Columns.Add(new DataColumn("Col2", typeof(string)));
            this.Columns.Add(new DataColumn("Col3", typeof(string)));
        }
        public string RepVisual()
        {
            // para mostrar/imprimir/gravar a lista
            // colocar as linhas em ordem e formatar as colunas

            StringBuilder ss = new StringBuilder("");
            DataRow[] EmOrdem;
            String fs = "{0,4} {1, 10} {2}\r\n";
            EmOrdem = this.Select("0<1", "Secao ASC, Posicao ASC");
            // 0<1 é um hack para selecionar todos. Alternativas: DataView ou Linq: OrderBy ThenBy
            foreach (DataRow rr in EmOrdem) 
                ss.Append(String.Format(fs, rr["Col1"], rr["Col2"], rr["Col3"]));

            ss.Append(" \r\n");  // empty line unfreezes scroll bars??
            return ss.ToString();
        }
    }
}
